package disruptor;

import com.lmax.disruptor.SleepingWaitStrategy;
import com.lmax.disruptor.dsl.Disruptor;
import com.lmax.disruptor.dsl.ProducerType;

import java.util.concurrent.Executors;

/**
 * @author: 李德才
 * @description:
 * @create: 2020-12-20 21:05
 **/
public class Disruptor_WaitStrategy {

    public static void main(String[] args) {
        /**
         * ---- 等待策略 ------
         * 1. (常用）BlockingWaitStrategy：通过线程阻塞的方式，等待生产者唤醒，被唤醒后，再循环检查依赖的sequence是否已经消费。
         * 2. BusySpinWaitStrategy：线程一直自旋等待，可能比较耗cpu
         * 3. LiteBlockingWaitStrategy：线程阻塞等待生产者唤醒，与BlockingWaitStrategy相比，区别在signalNeeded.getAndSet,
         *      如果两个线程同时访问一个访问waitfor,一个访问signalAll时，可以减少lock加锁次数.
         * 4. LiteTimeoutBlockingWaitStrategy：与LiteBlockingWaitStrategy相比，设置了阻塞时间，超过时间后抛异常。
         * 5. PhasedBackoffWaitStrategy：根据时间参数和传入的等待策略来决定使用哪种等待策略
         * 6. TimeoutBlockingWaitStrategy：相对于BlockingWaitStrategy来说，设置了等待时间，超过后抛异常
         * 7.（常用）YieldingWaitStrategy：尝试100次，然后Thread.yield()让出cpu
         * 8.（常用）SleepingWaitStrategy : 它的方式是循环等待并且在循环中间调用LockSupport.parkNanos(1)来睡眠，（在Linux系统上面睡眠时间60µs）.
         * 然而，它的优点在于生产线程只需要计数，而不执行任何指令。并且没有条件变量的消耗。
         * 但是，事件对象从生产者到消费者传递的延迟变大了。
         * SleepingWaitStrategy最好用在不需要低延迟，而且事件发布对于生产者的影响比较小的情况下。比如异步日志功能
         */
        new Disruptor<>(new DisruptorEventFactory(), 1024, Executors.defaultThreadFactory(), ProducerType.MULTI, new SleepingWaitStrategy());


    }
}
